package configs

import (
	"fmt"
	"log"
	"os"

	"github.com/kardianos/service"
)

// ServiceManager 服务管理器 - 专注于Linux平台systemd服务注册管理
type ServiceManager struct {
	config *ServiceConfig
}

// NewServiceManager 创建新的服务管理器
func NewServiceManager() *ServiceManager {
	return &ServiceManager{
		config: NewServiceConfig(),
	}
}

// HandleServiceCommand 处理服务管理命令
func (sm *ServiceManager) HandleServiceCommand(cmd string) {
	switch cmd {
	case "install":
		sm.installService()
	case "uninstall":
		sm.uninstallService()
	case "start":
		sm.startService()
	case "stop":
		sm.stopService()
	case "restart":
		sm.restartService()
	case "status":
		sm.showServiceStatus()
	default:
		fmt.Printf("未知的服务命令: %s\n", cmd)
		fmt.Println("可用的命令: install, uninstall, update")
	}
}

// installService 安装系统服务
func (sm *ServiceManager) installService() {
	config := CreateServiceOptions(sm.config)

	// 创建服务程序
	svc := &SystemdService{}

	// 创建服务
	s, err := service.New(svc, config)
	if err != nil {
		log.Fatalf("创建服务失败: %v", err)
	}

	// 安装服务
	if err := s.Install(); err != nil {
		log.Fatalf("安装服务失败: %v", err)
	}

	fmt.Printf("服务 '%s' 安装成功\n", sm.config.DisplayName)
	fmt.Printf("使用 '%s --service start' 启动服务\n", os.Args[0])
}

// uninstallService 卸载系统服务
func (sm *ServiceManager) uninstallService() {
	config := CreateServiceOptions(sm.config)

	// 创建服务程序
	svc := &SystemdService{}

	// 创建服务
	s, err := service.New(svc, config)
	if err != nil {
		log.Fatalf("创建服务失败: %v", err)
	}

	// 卸载服务
	if err := s.Uninstall(); err != nil {
		log.Fatalf("卸载服务失败: %v", err)
	}

	fmt.Printf("服务 '%s' 卸载成功\n", sm.config.DisplayName)
}

// startService 启动服务
func (sm *ServiceManager) startService() {
	config := CreateServiceOptions(sm.config)

	// 创建服务程序
	svc := &SystemdService{}

	// 创建服务
	s, err := service.New(svc, config)
	if err != nil {
		log.Fatalf("创建服务失败: %v", err)
	}

	// 启动服务
	if err := s.Start(); err != nil {
		log.Fatalf("启动服务失败: %v", err)
	}

	fmt.Printf("服务 '%s' 启动成功\n", sm.config.DisplayName)
}

// stopService 停止服务
func (sm *ServiceManager) stopService() {
	config := CreateServiceOptions(sm.config)

	// 创建服务程序
	svc := &SystemdService{}

	// 创建服务
	s, err := service.New(svc, config)
	if err != nil {
		log.Fatalf("创建服务失败: %v", err)
	}

	// 停止服务
	if err := s.Stop(); err != nil {
		log.Fatalf("停止服务失败: %v", err)
	}

	fmt.Printf("服务 '%s' 停止成功\n", sm.config.DisplayName)
}

// restartService 重启服务
func (sm *ServiceManager) restartService() {
	config := CreateServiceOptions(sm.config)

	// 创建服务程序
	svc := &SystemdService{}

	// 创建服务
	s, err := service.New(svc, config)
	if err != nil {
		log.Fatalf("创建服务失败: %v", err)
	}

	// 重启服务
	if err := s.Restart(); err != nil {
		log.Fatalf("重启服务失败: %v", err)
	}

	fmt.Printf("服务 '%s' 重启成功\n", sm.config.DisplayName)
}

// showServiceStatus 显示服务状态
func (sm *ServiceManager) showServiceStatus() {
	config := CreateServiceOptions(sm.config)

	// 创建服务程序
	svc := &SystemdService{}

	// 创建服务
	s, err := service.New(svc, config)
	if err != nil {
		log.Fatalf("创建服务失败: %v", err)
	}

	// 获取服务状态
	status, err := s.Status()
	if err != nil {
		log.Fatalf("获取服务状态失败: %v", err)
	}

	var statusText string
	switch status {
	case service.StatusRunning:
		statusText = "运行中"
	case service.StatusStopped:
		statusText = "已停止"
	case service.StatusUnknown:
		statusText = "未知"
	default:
		statusText = "未知状态"
	}

	fmt.Printf("服务 '%s' 状态: %s\n", sm.config.DisplayName, statusText)
}

// RunAsService 以服务模式运行应用
func (sm *ServiceManager) RunAsService() error {
	// 创建服务配置
	config := &service.Config{
		Name:        ServiceName,
		DisplayName: sm.config.DisplayName,
		Description: sm.config.Description,
		Arguments:   []string{"--service", "run"},
	}

	// 创建服务实例
	svc := &SystemdService{}

	// 创建服务
	s, err := service.New(svc, config)
	if err != nil {
		return err
	}

	// 运行服务
	return s.Run()
}

// SystemdService 系统服务结构体 - 简化版本，专注于systemd服务管理
type SystemdService struct{}

// Start 实现服务启动接口
func (s *SystemdService) Start(srv service.Service) error {
	log.Printf("系统服务正在启动...")
	return nil
}

// Stop 实现服务停止接口
func (s *SystemdService) Stop(srv service.Service) error {
	log.Printf("系统服务正在停止...")
	return nil
}

// IsService 检查是否在服务模式下运行
func IsService() bool {
	return service.Interactive() == false
}
